#ifndef DATA_PAGE
#define DATA_PAGE

#define BUCKET_SLOT_NUM               15
#define DATA_PAGE_SLOT_NUM 16
// use pm_address to locate the data in the page

// uncompressed page format design to store the buckets of PmEHash
// one slot stores one bucket of PmEHash
/*
the data entry stored by the  ehash
*/
#include<cstdint>
#include<stdlib.h>
#include<cstdio>
#include <errno.h>
#include<string.h>
#include"libpmem.h"

typedef struct kv
{
    uint64_t key;
    uint64_t value;
} kv;

typedef struct pm_bucket
{
    uint64_t local_depth;
    int  bitmap[BUCKET_SLOT_NUM];      // one bit for each slot
    kv       slot[BUCKET_SLOT_NUM];                                // one slot for one kv-pair
}    pm_bucket;
typedef struct data_page {
    // fixed-size record design
    // uncompressed page format
    uint32_t page_num;                        //页面号数
    int8_t  bitmap[DATA_PAGE_SLOT_NUM];       //页面位图，为0表示页面表中的bucket为空，为1表示该bucket有数据。bucket和slot是同一个概念。
    pm_bucket slot[DATA_PAGE_SLOT_NUM];       //bucket数组，也就是slot数组，用于存放数据。
} data_page;

data_page* newPage(uint64_t max_file_id, size_t & map_len);   //每次调用，向这个函数传递一个文件序号，如果是已有的文件，将打开该文件，如果是没有的文件，将创建一个新文件，并返回指向这个文件的指针,和所创建的文件的实际大小。由于我们使用data_page来创建文件，因此这个文件的指针可以当作一个指向data_page对象的指针。
bool deletePage(data_page * file_to_delete, int file_id); //给这个函数要删除的页面表的指针，以及这个页面表的大小，以及页面表的序号，如果删除成功，返回true，如果删除失败，返回false。


#endif
